package com.share.device.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.share.common.core.exception.ServiceException;
import com.share.device.service.IMapService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * @author zxl
 * @date 2025年03月21日 11:59
 */
@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class MapServiceImpl implements IMapService {

    @Autowired
    RestTemplate restTemplate;
    // 腾讯地图key
    @Value("${tencent.map.key}")
    private String key;

    // 成员变量定义
    private static final String STATUS = "status";

    /**
     * 根据地址名称获取经纬度
     *
     * @param keyword 地址名称
     * @return
     */
    @Override
    public JSONObject calculateLatLng(String keyword) {
        //腾讯地图解析接口（来自官网）
        String url = "https://apis.map.qq.com/ws/geocoder/v1/?address={address}&key={key}";

        Map<String, String> map = new HashMap<>();
        map.put("address", keyword);
        map.put("key", key);

        JSONObject response = restTemplate.getForObject(url, JSONObject.class, map);
        if (response == null || response.getIntValue(STATUS) != 0) {
            throw new ServiceException("地图解析异常");
        }

        //返回第一条最佳线路
        JSONObject result = response.getJSONObject("result");
        log.info(result.toJSONString());
        return result.getJSONObject("location");
    }

    /**
     * 计算两个坐标间距离的方法
     *
     * @param startLongitude 开始经度
     * @param startLatitude  开始纬度
     * @param endLongitude   结束经度
     * @param endLatitude    结束纬度
     * @return
     */
    @Override
    public Double calculateDistance(String startLongitude, String startLatitude, String endLongitude, String endLatitude) {
        // 请求路径
        String url = "https://apis.map.qq.com/ws/direction/v1/walking/?from={from}&to={to}&key={key}";
        // 参数封装
        Map<String, String> map = new HashMap<>();
        map.put("from", startLatitude + "," + startLongitude);
        map.put("to", endLatitude + "," + endLongitude);
        map.put("key", key);

        JSONObject result = restTemplate.getForObject(url, JSONObject.class, map);
        if (result == null || result.getIntValue(STATUS) != 0) {
            Optional.ofNullable(result).ifPresentOrElse(res -> {
                log.error("地图服务调用status:{}", result.getIntValue(STATUS) );
                log.error("地图服务调用失败状态说明：{}", result.getString("message"));
                throw new ServiceException("地图服务调用失败,原因：" + res.getString("message"));
            }, () -> {
                throw new ServiceException("地图服务调用失败,原因为返回对象是null");
            });
        }
        // 确保 result 不为 null
        if (result == null) {
            throw new ServiceException("地图服务调用失败,原因为返回对象是null");
        }

        // 确保 result.getJSONObject("result") 不为 null
        JSONObject resultObj = result.getJSONObject("result");
        if (resultObj == null) {
            throw new ServiceException("地图服务调用失败,原因为 result 对象中没有 result 字段");
        }

        // 确保 result.getJSONObject("result").getJSONArray("routes") 不为 null 且不为空
        JSONArray routes = resultObj.getJSONArray("routes");
        if (routes == null || routes.isEmpty()) {
            throw new ServiceException("地图服务调用失败,原因为 routes 数组为空或不存在");
        }
        //返回第一条最佳线路,返回的数据结构参考腾讯地图官网说明
        JSONObject route = routes.getJSONObject(0);
        // 单位：米
        return route.getBigDecimal("distance").doubleValue();
    }
}
